<?php
/**
 * Cette classe permet de définir les règles de l'anti brute force
 * La définition de la table se trouve à la fin du fichier
 *
 * @author Gaetan Collaud
 */
abstract class AntiBruteForce {
	/**
	 * Nombre de tentative autorisée
	 * @see TEMPS
	 */
	const NB_TENTATIVE = 5;

	/**
	 * Temps avant que les tentatives ne se remettre à zéro
	 * en minutes
	 * @see NB_TENTATIVE
	 */
	const TEMPS	= 10;

	/**
	 * Nombre de tentative de connexion avant que le compte soit bloqué
	 */
	const NB_BLOQUAGE = 500;

	/**
	 * Indique si le bloquage des utilisateurs est activé
	 */
	const BLOQUAGE_ENABLE = true;


	/**
	 * Ajoute une tentative echouée à la base de données
	 * @param String $user l'utilisateur concerné
	 */
	public static function connexionEchouee($user){
		Base::getSql()->exec('INSERT INTO anti_brute_force (userName, dateHeure)
			Values ("'.self::escp($user).'", NOW())');
	}

	/**
	 * Supprime les précédentes tentatives échouées de la base de données
	 * @param String $user l'utilisateur concerné
	 */
	public static function connexionReussie($user){
		Base::getSql()->exec('DELETE FROM anti_brute_force WHERE userName="'.self::escp($user).'"');
	}

	/**
	 * Indique si l'utilisateur n'a pas déjà dépassé son quota
	 * @param String $user l'utilisateur concerné
	 * @return bool true s'il est autorisé à continuer
	 */
	public static function estAutorise($user){
		$timeAutorise = time()-60*self::TEMPS;
		$r = Base::getSql()->query('SELECT COUNT(*) nb FROM anti_brute_force
			WHERE userName="'.self::escp($user).'" AND
			UNIX_TIMESTAMP(dateHeure)>'.$timeAutorise, true);
		return $r['nb']<self::NB_TENTATIVE;
	}

	/**
	 * Indique si l'utilisateur à été bloqué
	 * @param String $user l'utilisateur concerné
	 */
	public static function estBloque($user){
		if(!self::BLOQUAGE_ENABLE) return false;
		$r = Base::getSql()->query('SELECT COUNT(*) nb FROM anti_brute_force WHERE userName="'.self::escp($user).'"', true);
		return $r['nb']>=self::NB_BLOQUAGE;
	}

	public static function debloquer($user){
		Base::getSql()->exec('DELETE FROM anti_brute_force WHERE userName="'.self::escp($user).'"');
	}

	/**
	 * Raccourci pour échaper les strings
	 * @param String $user la chaine à échapé
	 * @return String la chaine échapée
	 */
	private static function escp($user){
		return Base::getSql()->escape($user);
	}

}

/**
 * Définition de la table :
------------------------------------------------------------
CREATE TABLE  `anti_brute_force` (
`userName` VARCHAR( 50 ) NOT NULL ,
`dateHeure` DATETIME NOT NULL ,
INDEX (  `userName` )
) ENGINE = MYISAM ;
------------------------------------------------------------
 */
?>
